什么是目录
目录是一种特殊的文件, 它的内容是文件和目录的名字. 它包含很多记录, 每个记录的格式由统一的标准定义.每条记录代表一个文件或目录
与普通文件不同的是, 目录文件永远不会空, 每个目录都至少包含两个特殊的项 ---- "." 和 "..", 分别表示当前目录和上一级目录
目录操作
目录可以被 open
、read
、close
打开
实际上用open
、read
、close
这些系统调用来操作目录兵士很好的方法, Unix 支持多种目录类型, 如果用 read 来读, 那么需要了解这些不同类型目录各自的结构细节
如何读取目录
可以在联机帮助中根据关键字 direct 来查找答案
$ man -k direct
过滤一下
$ man -k direct | grep read
找到 readdir
$ man 3 reddir
通过返回可以知道, 从目录数据与从文件读数据是类似的, opendir 打开一个目录, readdir 返回目录中的当前项, closedir 关闭一个目录, seekdir, telldir, rewinddir 与 lseek 的功能类似
目录是文件的列表, 更确切的说, 是记录的序列, 每条记录对应一个文件或子目录. 通过 readdir 来读取目录中的记录, readdir 返回一个指向目录的当前记录的指针, 记录的类型是 struct dirent, 这个结构定义在 /usr/include/dirent.h 中
ls.1
根据上面知识可以写出一个 ls1.c
#include <stdio.h> #include <sys/types.h> #include <dirent.h> void do_ls(char []); int main( int argc, char **argv ) { if (argc == 1) do_ls("."); else while (--argc){ printf("%s:\n", *++argv); do_ls(*argv); } return 0; } void do_ls(char dirname[]) { DIR *dir_ptr; struct dirent *direntp; if ((dir_ptr = opendir(dirname)) == NULL) fprintf(stderr, "ls1: cannot open %s\n", dirname); else while ((direntp = readdir(dir_ptr)) != NULL) printf("%s\n", direntp->d_name); closedir(dir_ptr); }